home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / xmmlrg.exe / XMM.ASM < prev    next >
Assembly Source File  |  1991-12-03  |  6KB  |  303 lines

  1.     TITLE   XMM_INTERFACE.ASM
  2.     NAME    XMM_INTERFACE
  3.  
  4. ;*******************************************************************************
  5. ;                                           ;
  6. ;    XMM C Interface Routines                           ;
  7. ;                                           ;
  8. ;    Copyright (c) 1988, Microsoft Corporation                   ;
  9. ;                                           ;
  10. ;    Modified 8/4/91 for large model by Tom Frank, BIMCO
  11. ;                                           ;
  12. ;*******************************************************************************
  13.  
  14. ?PLM=0
  15. ?WIN=0
  16. memL    equ    1
  17.  
  18. include    cmacros.inc
  19.  
  20. sBegin    Data
  21. XMM_Initialised    dw    0
  22. XMM_Control    label    dword
  23.         dw    CodeOFFSET XMM_NotInitialised
  24.         dw    seg _TEXT
  25. sEnd    Data
  26.  
  27. sBegin    Code
  28. assumes    cs, Code
  29. assumes ds, DGROUP
  30.  
  31. ;
  32. ; Macro to convert from XMS success/fail to
  33. ; a form more acceptable for C.  IE.
  34. ;
  35. ; AX == 1 becomes DX:AX = 0
  36. ; AX != 1 becomes DX:AX = BL << 24 | (AX - 1)
  37. ;
  38. ; Since Error Codes returned in BL have the top bit
  39. ; set, C will interpret the return as negative.
  40. ;
  41. SuccessFail    macro
  42.     local    Success
  43.     xor    dx, dx
  44.     dec    ax
  45.     jz    Success
  46.     mov    dh, bl
  47. Success:
  48.     endm
  49.  
  50. ;
  51. ; Macro to convert from XMS return value in AX
  52. ; a form more acceptable for C.  IE.
  53. ;
  54. ; AX != 0 becomes DX:AX = AX
  55. ; AX == 0 becomes DX:AX = BL << 24 | AX
  56. ;
  57. ; Since Error Codes returned in BL have the top bit
  58. ; set, C will interpret the return as negative.
  59. ; XMS returns of this type return BL == 0 on success.
  60. ;
  61. SuccessFailAX    macro
  62.     local    Success
  63.     xor    dx, dx
  64.     or    ax, ax
  65.     jnz    Success
  66.     mov    dh, bl
  67. Success:
  68.     endm
  69.  
  70. ;
  71. ; Macro to convert from XMS return value in DX
  72. ; a form more acceptable for C.  IE.
  73. ;
  74. ; AX != 0 becomes DX:AX = DX
  75. ; AX == 0 becomes DX:AX = BL << 24 | DX
  76. ;
  77. ; Since Error Codes returned in BL have the top bit
  78. ; set, C will interpret the return as negative.
  79. ; XMS returns of this type return BL == 0 on success.
  80. ;
  81. SuccessFailDX    macro
  82.     local    Success
  83.     or    ax, ax
  84.     mov    ax, dx
  85.     mov    dx, 0                ; Preserves Flags
  86.     jnz    Success
  87.     mov    dh, bl
  88. Success:
  89.     endm
  90.  
  91.  
  92. cProc    XMM_NotInitialised, <FAR>
  93. cBegin
  94.     xor    ax, ax                ; Immediate failure
  95.     mov    bl, 80h                ; Not Implemented
  96. cEnd
  97.  
  98. cProc    XMM_Installed, <FAR, PUBLIC>, <si, di, ds>
  99. cBegin
  100.     cmp    [XMM_Initialised], 0
  101.     jne    Already_Initialised
  102.     mov    ax, 4300h            ; Test for XMM
  103.     int    2fh
  104.     cmp    al, 80h
  105.     jne    NoDriver
  106.  
  107.     mov    ax, 4310h            ; Get Control Function
  108.     int    2fh
  109.     mov    word ptr [XMM_Control], bx
  110.     mov    word ptr [XMM_Control+2], es
  111.     inc    [XMM_Initialised]
  112. NoDriver:
  113. Already_Initialised:
  114.     mov    ax, [XMM_Initialised]
  115. cEnd
  116.  
  117.  
  118. cProc    XMM_Version, <FAR, PUBLIC>, <si, di, ds>
  119. cBegin
  120.     xor    ah, ah                ; Function 0
  121.     call    [XMM_Control]
  122.     mov    dx, bx                ; Return a long
  123. cEnd
  124.  
  125.  
  126. ;
  127. ;    long    XMM_RequestHMA(Space_Needed: unsigned short);
  128. ;
  129. cProc    XMM_RequestHMA, <FAR, PUBLIC>, <si, di, ds>
  130. parmW    Space_Needed
  131. cBegin
  132.     mov    ah, 1
  133.     mov    dx, Space_Needed
  134.     call    [XMM_Control]
  135.     SuccessFail
  136. cEnd
  137.  
  138. cProc    XMM_ReleaseHMA, <FAR, PUBLIC>, <si, di, ds>
  139. cBegin
  140.     mov    ah, 2
  141.     call    [XMM_Control]
  142.     SuccessFail
  143. cEnd
  144.  
  145. cProc    XMM_GlobalEnableA20, <FAR, PUBLIC>, <si, di, ds>
  146. cBegin
  147.     mov    ah, 3
  148.     call    [XMM_Control]
  149.     SuccessFail
  150. cEnd
  151.  
  152. cProc    XMM_GlobalDisableA20, <FAR, PUBLIC>, <si, di, ds>
  153. cBegin
  154.     mov    ah, 4
  155.     call    [XMM_Control]
  156.     SuccessFail
  157. cEnd
  158.  
  159. cProc    XMM_EnableA20, <FAR, PUBLIC>, <si, di, ds>
  160. cBegin
  161.     mov    ah, 5
  162.     call    [XMM_Control]
  163.     SuccessFail
  164. cEnd
  165.  
  166. cProc    XMM_DisableA20, <FAR, PUBLIC>, <si, di, ds>
  167. cBegin
  168.     mov    ah, 6
  169.     call    [XMM_Control]
  170.     SuccessFail
  171. cEnd
  172.  
  173. cProc    XMM_QueryA20, <FAR, PUBLIC>, <si, di, ds>
  174. cBegin
  175.     mov    ah, 7
  176.     call    [XMM_Control]
  177.     SuccessFailAX
  178. cEnd
  179.  
  180. cProc    XMM_QueryLargestFree, <FAR, PUBLIC>, <si, di, ds>
  181. cBegin
  182.     mov    ah, 8
  183.     call    [XMM_Control]
  184.     SuccessFailAX
  185. cEnd
  186.  
  187. cProc    XMM_QueryTotalFree, <FAR, PUBLIC>, <si, di, ds>
  188. cBegin
  189.     mov    ah, 8
  190.     call    [XMM_Control]
  191.     SuccessFailDX
  192. cEnd
  193.  
  194. cProc    XMM_AllocateExtended, <FAR, PUBLIC>, <si, di, ds>
  195. parmW    SizeK
  196. cBegin
  197.     mov    ah, 9
  198.     mov    dx, SizeK
  199.     call    [XMM_Control]
  200.     SuccessFailDX
  201. cEnd
  202.  
  203. cProc    XMM_FreeExtended, <FAR, PUBLIC>, <si, di, ds>
  204. parmW    Handle
  205. cBegin
  206.     mov    ah, 0Ah
  207.     mov    dx, Handle
  208.     call    [XMM_Control]
  209.     SuccessFail
  210. cEnd
  211.  
  212. cProc    XMM_MoveExtended, <FAR, PUBLIC>, <si, di, ds>
  213. parmD    pInfo
  214. cBegin
  215.     mov    ah, 0Bh
  216.     push    ds
  217.     pop    es
  218.     lds    si,pInfo            ; DS:SI=>parameter block
  219. assumes es, DGROUP
  220.     call    es:[XMM_Control]
  221. assumes es, NOTHING
  222.     SuccessFail
  223. cEnd
  224.  
  225. cProc    XMM_LockExtended, <FAR, PUBLIC>, <si, di, ds>
  226. parmW    Handle
  227. cBegin
  228.     mov    ah, 0Ch
  229.     mov    dx, Handle
  230.     call    [XMM_Control]
  231.     xchg    ax, bx
  232.     dec    bx
  233.     jz    XMML_Success
  234.     mov    dh, al
  235. XMML_Success:
  236. cEnd
  237.  
  238. cProc    XMM_UnLockExtended, <FAR, PUBLIC>, <si, di, ds>
  239. parmW    Handle
  240. cBegin
  241.     mov    ah, 0Dh
  242.     mov    dx, Handle
  243.     call    [XMM_Control]
  244.     SuccessFail
  245. cEnd
  246.  
  247. cProc    XMM_GetHandleLength, <FAR, PUBLIC>, <si, di, ds>
  248. parmW    Handle
  249. cBegin
  250.     mov    ah, 0Eh
  251.     mov    dx, Handle
  252.     call    [XMM_Control]
  253.     SuccessFailDX
  254. cEnd
  255.  
  256. cProc    XMM_GetHandleInfo, <FAR, PUBLIC>, <si, di, ds>
  257. parmW    Handle
  258. cBegin
  259.     mov    ah, 0Eh
  260.     mov    dx, Handle
  261.     call    [XMM_Control]
  262.     mov    dx, bx
  263.     SuccessFailDX
  264. cEnd
  265.  
  266. cProc    XMM_ReallocateExtended, <FAR, PUBLIC>, <si, di, ds>
  267. parmW    Handle
  268. parmW    NewSize
  269. cBegin
  270.     mov    ah, 0Fh
  271.     mov    dx, Handle
  272.     mov    bx, NewSize
  273.     call    [XMM_Control]
  274.     SuccessFail
  275. cEnd
  276.  
  277. cProc    XMM_RequestUMB, <FAR, PUBLIC>, <si, di, ds>
  278. parmW    UMBSize
  279. cBegin
  280.     mov    ah, 10h
  281.     mov    dx, UMBSize
  282.     call    [XMM_Control]
  283.     xchg    bx, ax            ; Segment in AX, Size in DX
  284.     dec    bx
  285.     jz    RUMB_Success
  286.     xchg    ax, dx            ; Largest available size in AX
  287.     mov    dh, dl            ; Error code now in DH
  288. RUMB_Success:
  289. cEnd
  290.  
  291. cProc    XMM_ReleaseUMB, <FAR, PUBLIC>, <si, di, ds>
  292. parmW    UMBSegment
  293. cBegin
  294.     mov    ah, 11h
  295.     mov    dx, UMBSegment
  296.     call    [XMM_Control]
  297.     SuccessFail
  298. cEnd
  299.  
  300. sEnd    Code
  301.  
  302. END
  303.